package com.lncg.scheduler;

import com.lncg.entity.BusinessPortConfig;
import com.lncg.service.IDynamicPortService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

/**
 * 动态端口调度器
 * 
 * 定时检测数据库中的端口配置变化，动态启动或停止端口。
 * 支持实时响应端口配置的变更。
 * 
 * @author LNCG
 * @version 1.2.0
 * @since 2024-10-17
 */
@Component
public class DynamicPortScheduler {
    
    /** 日志记录器 */
    private static final Logger logger = LoggerFactory.getLogger(DynamicPortScheduler.class);
    
    /** 动态端口管理服务 */
    @Autowired
    private IDynamicPortService dynamicPortService;
    
    /**
     * 定时检测端口配置变化
     * 
     * 每30秒执行一次，检测数据库中的端口配置变化，
     * 自动启动新增的端口，停止已禁用的端口。
     */
    @Scheduled(fixedRate = 10000) // 每30秒执行一次
    public void checkPortChanges() {
        try {
            // 检测端口变化
            IDynamicPortService.PortChangeResult result = dynamicPortService.detectPortChanges();
            
            if (!result.hasChanges()) {
                logger.debug("端口配置无变化");
                return;
            }
            
            // 处理需要停止的端口
            for (Integer portToStop : result.getPortsToStop()) {
                logger.info("检测到端口 {} 需要停止", portToStop);
                boolean success = dynamicPortService.stopPort(portToStop);
                if (success) {
                    logger.info("端口 {} 停止成功", portToStop);
                } else {
                    logger.error("端口 {} 停止失败", portToStop);
                }
            }
            
            // 处理需要启动的端口
            for (BusinessPortConfig configToStart : result.getPortsToStart()) {
                logger.info("检测到端口 {} 需要启动 (业务: {})", 
                    configToStart.getPort(), configToStart.getBusinessName());
                boolean success = dynamicPortService.startPort(configToStart.getPort());
                if (success) {
                    logger.info("端口 {} 启动成功 (业务: {})", 
                        configToStart.getPort(), configToStart.getBusinessName());
                } else {
                    logger.error("端口 {} 启动失败 (业务: {})", 
                        configToStart.getPort(), configToStart.getBusinessName());
                }
            }
            
            // 记录当前运行状态
            int runningCount = dynamicPortService.getRunningPorts().size();
            logger.info("端口动态调整完成，当前运行端口数: {}", runningCount);
            
        } catch (Exception e) {
            logger.error("定时检测端口变化失败: {}", e.getMessage(), e);
        }
    }
    
    /**
     * 定期输出端口运行状态
     * 
     * 每5分钟输出一次当前运行的端口状态，便于监控。
     */
    @Scheduled(fixedRate = 300000) // 每5分钟执行一次
    public void reportPortStatus() {
        try {
            var runningPorts = dynamicPortService.getRunningPorts();
            if (runningPorts.isEmpty()) {
                logger.info("当前无运行中的端口");
            } else {
                logger.info("当前运行端口: {}", runningPorts);
            }
        } catch (Exception e) {
            logger.error("输出端口状态失败: {}", e.getMessage(), e);
        }
    }
}
